sysroot: Avoid bad double-free
authorColin Walters <walters@verbum.org>
Thu, 3 Oct 2013 22:30:07 +0000 (18:30 -0400)
committerColin Walters <walters@verbum.org>
Thu, 3 Oct 2013 22:34:24 +0000 (18:34 -0400)
If a deployment is somehow in the list twice, the hash table will free
the *new* value with g_hash_table_insert which gets all broken.  Just
use g_hash_table_replace().

src/libostree/ostree-sysroot-cleanup.c

index 884597b2343f73d5ddd688efa750d51b27ea98d3..ade75bbaf114e29d0f1243a07b465dd8ece8bfaf 100644 (file)
@@ -304,7 +304,7 @@ cleanup_old_deployments (OstreeSysroot       *self,
                                    cancellable, error))
     goto out;
 
-  active_deployment_dirs = g_hash_table_new_full (g_file_hash, (GEqualFunc)g_file_equal, NULL, g_object_unref);
+  active_deployment_dirs = g_hash_table_new_full (g_file_hash, (GEqualFunc)g_file_equal, g_object_unref, NULL);
   active_boot_checksums = g_hash_table_new_full (g_str_hash, (GEqualFunc)g_str_equal, g_free, NULL);
 
   for (i = 0; i < self->deployments->len; i++)
@@ -313,8 +313,8 @@ cleanup_old_deployments (OstreeSysroot       *self,
       GFile *deployment_path = ostree_sysroot_get_deployment_directory (self, deployment);
       char *bootcsum = g_strdup (ostree_deployment_get_bootcsum (deployment));
       /* Transfer ownership */
-      g_hash_table_insert (active_deployment_dirs, deployment_path, deployment_path);
-      g_hash_table_insert (active_boot_checksums, bootcsum, bootcsum);
+      g_hash_table_replace (active_deployment_dirs, deployment_path, deployment_path);
+      g_hash_table_replace (active_boot_checksums, bootcsum, bootcsum);
     }
 
   if (!list_all_deployment_directories (self, &all_deployment_dirs,